<?php
namespace app\common\controller;
/**
 * Created by lihuan.
 * User: lihuan
 * Date: 2018/3/29 0029
 * Time: 下午 2:43
 */

/**
 * 用于网络传输内容的变换显示和加密（防篡改）。
 * 如果只是用于变换形式：使用base64_url_encode和base64_url_decode方法就可以。
 * 如果需要变换形式+加解密：使用url_value_encode和url_value_decode方法。
 * @author lihuan
 * 
 */
class UrlTransEncrypt{
    //url base64编码
    static function base64_url_encode($string) {
        $data = base64_encode($string);
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
        return $data;
    } 
    //url base64解码
    static function base64_url_decode($string) {
        $data = str_replace(array('-','_'),array('+','/'),$string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }
    
    //将网络传输中的值进行加密
    static function url_value_encode($value,$encrypt_code=''){
        if (empty($encrypt_code)){
            $encrypt_code=config('encrypt_code');
        }
        $a=UrlTransEncrypt::base64_url_encode($value);
        $b=md5($encrypt_code.$a.$encrypt_code);
        return [
            "a"=>$a,//传输内容
            "b"=>$b//加密值
        ];
    }
    
    //验证数据是否被篡改。如果已经被篡改，返回0，否则返回原值。
    static function url_value_decode($a,$b,$encrypt_code=''){
        if (empty($encrypt_code)){
            $encrypt_code=config('encrypt_code');
        }
        $encrypt_result=md5($encrypt_code.$a.$encrypt_code);
        
        if ($b!=$encrypt_result){
            //数据已经被篡改
            return [];
        }
        $value = UrlTransEncrypt::base64_url_decode($a);
        //必须返回数组，不能直接返回$value，防止$value为0或者是空字符串，导致调用方判断出错。
        return [
            "value"=>$value
        ];
    }
}